import com.vmware.vim25.*;
import com.vmware.vim25.mo.*;

import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.*;

public class GetPerformanceChart {

  /**
   * @param args
   */
  public static void main(String[] args) {

    try {
      ServiceInstance serviceInstance = new ServiceInstance(
        new URL("https://10.16.2.59/sdk"), "root", "vmware", true);

        Folder rootFolder = serviceInstance.getRootFolder();
        InventoryNavigator rootNavi = new InventoryNavigator(rootFolder);

      //パフォーマンスマネージャの取得
      PerformanceManager perfMgr = serviceInstance.getPerformanceManager();
      Map colNameMap = getCounterInfoMap(perfMgr);

      //パフォーマンス情報の取得条件設定
      PerfQuerySpec qSpec = new PerfQuerySpec();

      //パフォーマンス情報の取得対象を設定する
      HostSystem targetVm = (HostSystem) rootNavi
        .searchManagedEntity("HostSystem", "10.16.2.32");
      qSpec.setEntity(targetVm.getMOR());

      //取得するデータの開始時刻と終了時刻を設定する
      // 設定値: 1時間前から現在時刻まで
      Calendar curTime = serviceInstance.currentTime();
      Calendar startTime = (Calendar)curTime.clone();
      startTime.roll(Calendar.HOUR, -1);
      qSpec.setStartTime(startTime);

      Calendar endTime = (Calendar)curTime.clone();
      qSpec.setEndTime(endTime);

      //データの感覚を300秒(5分)に設定する
      int perfInterval = 300;
      qSpec.setIntervalId(perfInterval);

      //取得可能な項目のリストを取得し設定する
      PerfMetricId[] pmis = null;
      pmis =perfMgr.queryAvailablePerfMetric(
          targetVm,
          startTime,
          endTime,
          perfInterval);
      qSpec.setMetricId(pmis);

      //取得するパフォーマンス情報の形式を設定する
      qSpec.setFormat("normal"); //normalの他にcsvが設定可能です

      //パフォーマンス情報を取得
      PerfEntityMetricBase[] pembss = perfMgr.queryPerf(new PerfQuerySpec[]{qSpec});
      SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");

      String seriesStr = "";
      //取得したデータから表示用データを標準出力する
      for (PerfEntityMetricBase pemb : pembss){  //エンティティごとの値ループ
        PerfEntityMetric pem = (PerfEntityMetric) pemb;

        //サンプルの時刻情報
        PerfSampleInfo[] psis = pem.getSampleInfo();

        //値の取得
        PerfMetricSeries[] pmsValues = pem.getValue();
        int row =0;

        for (PerfMetricSeries pmsValue:pmsValues){//系列毎の値ループ
          int counterId = pmsValue.getId().getCounterId();

          //カウンタID:2 = CPU利用率 、カウンタID:24 = メモリ使用量
          if (counterId == 2 || counterId == 24 ){

            //系列ごとの値を取得する
            PerfMetricIntSeries pmiss = (PerfMetricIntSeries)pmsValue;
            long[] values = pmiss.getValue();
            
            System.out.print("[");

            for (int i = 0 ; i < values.length ; i++){
              System.out.print("[\""+sdf.format(psis[i].getTimestamp().getTime())+"\","+values[i]+"]");
              if (i < values.length -1) {
                System.out.print(",");
              }
            }
            System.out.println("],");

            //系列の情報を出力する
            seriesStr +="{label: '" + counterId + ":" +colNameMap.get(counterId) + "',},\n";

          }
        }
      }

      //系列情報の出力
      System.out.println(seriesStr);

    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  /**
   * 系列の名称情報を取得し、Map化する
   * @param perfMgr
   * @return
   */
  private static Map getCounterInfoMap(PerformanceManager perfMgr){

    Map infoMap = new HashMap();
    //系列情報を取得(取得されるリストには仮想マシンで取得可能なもの意外も含まれます。)
    PerfCounterInfo[] pcis =  perfMgr.getPerfCounter();
    for (PerfCounterInfo pci :pcis ){
      infoMap.put(pci.getKey(),pci.getGroupInfo().getLabel()+":"+pci.getNameInfo().getLabel());
    }
    return infoMap;

  }
}